package ru.susu.algebra.gap.parser;

import java.util.StringTokenizer;

import ru.susu.algebra.io.FileUtilities;

/**
 * Базовый класс парсера GAP результатов
 *
 * @author akargapolov
 * @since: 03.05.2010
 */
public abstract class GapFileParserBase<T> implements IGapFileParser<T>
{
	/**
	 * {@inheritDoc}
	 */
	public synchronized T parseFile(String fileName) throws Exception
	{
		startProcessing();
		String contents = FileUtilities.getFileAsString(fileName);
		StringTokenizer tokenizer = new StringTokenizer(contents, getDelimeters());
		while(tokenizer.hasMoreTokens())
		{
			processToken(tokenizer.nextToken());
		}
		return getResult();
	}

	/**
	 * @return специфичные для конкретного парсинга разделители
	 */
	protected abstract String getAdditionalDelimeters();

	/**
	 * Обработка одного токена строки
	 * @param token
	 */
	protected abstract void processToken(String token);

	/**
	 * @return результат обработки всего файла
	 */
	protected abstract T getResult();

	/**
	 * Инициализация обработки одного файла.
	 */
	protected abstract void startProcessing();

	/**
	 * @return разделители слов в файле
	 */
	protected String getDelimeters()
	{
		return " \t\n\r\f" + getAdditionalDelimeters();
	}
}
